![golang echoアプリの自動テストを書く](https://devio2023-media.developers.io/wp-content/uploads/2015/02/golang.png)
golang echoアプリの自動テストを書く
丹内です。Golang 1.6とEchoフレームワークを使ったアプリケーションに対して自動テストを書いてみます。
前提
MacでGo 1.6を使います。パッケージ管理はglideです。
ディレクトリ構成は以下のとおりです
$GOPATH/ ├── .envrc ├── .git/(省略) ├── .gitignore ├── README.md ├── bin/(省略) ├── pkg/(省略) ├── src │ ├── github.com │ │ ├── alecthomas │ │ │ ├── gocyclo │ │ │ │ ├── LICENSE (省略) │ ├── myproject │ │ ├── glide.lock │ │ ├── glide.yaml │ │ ├── handler │ │ │ ├── handler.go │ │ │ └── handler_test.go │ │ ├── main.go │ │ └── vendor │ │ ├── github.com │ │ │ ├── dgrijalva │ │ │ │ └── jwt-go │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md (省略)
myprojectが今回のプロジェクト名です。
コードを書く
$GOPATH/src/myproject/main.go
package main import ( "myproject/handler" "github.com/labstack/echo" "github.com/labstack/echo/engine/standard" "github.com/labstack/echo/middleware" ) var ( mockDB = map[string]string{ "1": "one", "2": "two", "3": "three", } ) func main() { e := echo.New() h := handler.Handler{mockDB} e.Use(middleware.Logger()) e.Use(middleware.Recover()) e.GET("/", h.GetUser) e.Run(standard.New(":1323")) }
$GOPATH/src/myproject/handler/handler.go
package handler import ( "net/http" "github.com/labstack/echo" ) type ( Handler struct { Db map[string]string } migrationResultJSON struct { Id string `json:"Id"` } ) func (h Handler) GetUser(c echo.Context) error { user := h.Db["1"] if user == "" { return echo.NewHTTPError(http.StatusNotFound, "user not found") } return c.JSON(http.StatusOK, migrationResultJSON{Id: user}) }
$GOPATH/src/myproject/handler/handler_test.go
package handler import ( "net/http" "net/http/httptest" "testing" "github.com/labstack/echo" "github.com/labstack/echo/engine/standard" ) var ( testMockDB = map[string]string{ "1": "one", "2": "two", "3": "three", } ) func TestGetUser(t *testing.T) { e := echo.New() req := new(http.Request) rec := httptest.NewRecorder() c := e.NewContext(standard.NewRequest(req, e.Logger()), standard.NewResponse(rec, e.Logger())) c.SetPath("/") h := Handler{testMockDB} h.GetUser(c) if rec.Body.String() != "{\"id\":\"one\"}" { t.Errorf("expected response Id: one, got %s", rec.Body.String()) } }
テストを実行する
handlerディレクトリに移動してテストコマンドを打つとテストが走ります。
$ cd $GOPATH/src/myproject/handler; go test PASS ok myproject/handler 0.011s
ブラウザでhttp://localhost:1323
にアクセスしても{"id": "one"}
のJSONが返ってきます。